#ifndef __OTA_H__
#define __OTA_H__

#include "n32g430.h"

// 运行模式定义
typedef enum {
    RUN_MODE_BOOT = 0,
    RUN_MODE_APP  = 1
} RunMode_TypeDef;

// 定义Flash地址
#define BOOTLOADER_START_ADDR  0x08000000
#define BOOTLOADER_SIZE        0x4000          // 16KB
#define APP_START_ADDR         0x08006000      // 应用程序起始地址
#define APP_SIZE              (0x20000-0x4000) // 应用程序最大大小(128KB-16KB)
#define FLASH_PAGE_SIZE       0x800           // 1KB


// Flash升级标志地址(放在Flash最后一页)
#define FLASH_FLAG_ADDR        0x0800F000  // STM32F103C8的最后一页起始地址
#define FLASH_UPGRADE_FLAG     0x5A5A5A5A  // 升级标志值

// 定义Flash中的ID地址（根据.map文件）
#define DEVICE_ID_ADDR    0x08005800

// 同步字定义
#define OTA_SYNC_WORD         0xAA55       // 同步字(小端格式)

// OTA升级状态码
typedef enum {
    OTA_OK = 0,
    OTA_ERROR,
    OTA_ERROR_SIZE,    // 大小错误
    OTA_ERROR_ALIGN,   // 对齐错误
    OTA_ERROR_RANGE,   // 范围错误
    OTA_ERROR_ERASE,   // 擦除错误
    OTA_ERROR_WRITE,   // 写入错误
    OTA_ERROR_VERIFY   // 验证错误
} OTA_Status;

// OTA命令
typedef enum {
    OTA_CMD_START = 0xA0,   // 开始升级
    OTA_CMD_DATA  = 0xA1,   // 发送数据
    OTA_CMD_END   = 0xA2,   // 结束升级
    OTA_CMD_VERIFY = 0xA3,  // 固件校验
    OTA_CMD_ABORT = 0xA4,   // 中止升级
    OTA_CMD_RESUME = 0xA5   // 断点续传请求
} OTA_Command;

// OTA响应
typedef enum {
    OTA_RESP_OK    = 0x50,  // 操作成功
    OTA_RESP_ERROR = 0x51,  // 操作失败
    OTA_RESP_READY = 0x52,  // 准备就绪
    OTA_RESP_RESUME = 0x53  // 断点续传响应，返回已接收大小
} OTA_Response;

// OTA数据包结构
typedef struct __attribute__((packed)) {
    uint16_t sync;          // 同步字 0x55AA
    uint16_t length;        // 数据长度(不包含sync和length字段)
    uint8_t  cmd;           // 命令
    uint8_t  data[];        // 数据
    // checksum在数据之后，不包含在结构体中
} OTA_Packet;

// 固件数据包结构
typedef struct __attribute__((packed)) {
    uint32_t addr;          // 写入地址
    uint8_t  data[];        // 固件数据
} OTA_DataPacket;

// 开始命令数据结构
typedef struct __attribute__((packed)) {
    uint32_t size;          // 固件大小
    uint32_t crc32;         // CRC32校验值
} OTA_StartPacket;

// 分片传输相关定义
#define MAX_FRAGMENT_SIZE    2048    // 最大分片大小
#define FRAGMENT_HEADER_SIZE 8       // 分片头大小

// 分片标志定义
typedef enum {
    FRAGMENT_START = 0x01,   // 第一个分片
    FRAGMENT_MIDDLE = 0x02,  // 中间分片
    FRAGMENT_END = 0x03,     // 最后一个分片
    FRAGMENT_SINGLE = 0x04   // 单个分片(不需要分片的情况)
} Fragment_Flag;

// 分片头结构
typedef struct __attribute__((packed)) {
    uint16_t fragment_id;    // 分片序号
    uint16_t total_fragments;// 总分片数
    uint16_t fragment_size;  // 当前分片大小
    uint8_t  flag;          // 分片标志
    uint8_t  reserved;      // 保留字节(对齐)
} Fragment_Header;

// 分片数据包结构
typedef struct __attribute__((packed)) {
    Fragment_Header header;  // 分片头
    uint8_t data[];         // 分片数据
} OTA_Fragment;

// 固件信息结构体
typedef struct {
    uint32_t total_size;     // 固件总大小
    uint32_t received_size;  // 已接收大小
    uint32_t crc32;         // CRC32校验值
    uint16_t packet_count;   // 数据包计数
    uint32_t last_addr;      // 最后写入的地址
    uint8_t  is_resuming;    // 是否为断点续传
    uint16_t current_fragment; // 当前分片序号
    uint16_t total_fragments;  // 总分片数
    uint8_t  fragment_buffer[MAX_FRAGMENT_SIZE]; // 分片缓冲区
} OTA_FirmwareInfo;

// 函数声明
OTA_Status OTA_Init(void);
OTA_Status OTA_SetUpgradeFlag(void);
OTA_Status OTA_ClearUpgradeFlag(void);
uint8_t OTA_CheckUpgradeFlag(void);
RunMode_TypeDef OTA_GetRunMode(void);
uint32_t OTA_CalculateCRC32(uint32_t addr, uint32_t size);
uint32_t OTA_CalculateBufferCRC32(uint8_t *buffer, uint32_t size);
OTA_Status OTA_Update(uint8_t *data, uint32_t size);
OTA_Status Erase_App_Area(uint32_t size);
void OTA_JumpToApp(void);

#endif /* __OTA_H__ */
